package no.dusken.aranea.admin.control; import no.dusken.aranea.model.*; import no.dusken.aranea.service.*; import no.dusken.aranea.util.ImageUtils; import no.dusken.common.service.GenericService; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.mock.web.MockMultipartFile; import org.springframework.ui.ExtendedModelMap; import org.springframework.ui.Model; import java.io.File; import java.io.IOException; import java.util.LinkedList; import java.util.List; import static org.junit.Assert.*; import static org.mockito.Mockito.when; /** * @author Marvin B. Lillehaug <lillehau@underdusken.no> */ public class UploadControllerTest { @InjectMocks private ImageUploadController controller; private File workFolder; @Mock private TagService tagService; @Mock private PersonService personService; @Mock private ImageService imageService; @Mock private StoreImageService storeImageService; @Mock private PageService pageService; @Mock private GenericService<PageImage> pageImageService; @Mock private ImageUtils imageUtils; private MockMultipartFile mockMultipartFile; @Before public void setUp() throws Exception { mockMultipartFile = new MockMultipartFile("File", "file2.jpg","img", new byte[]{1,2, 3, 4,5, 66, 7, 7, 8, 9, 77, 8,9, 0} ); controller = new ImageUploadController(); String property = System.getProperty("java.io.tmpdir"); File tmp = new File(property); controller.setTmpFolder(tmp); workFolder = new File(tmp, controller.getClass().getSimpleName()); MockitoAnnotations.initMocks(this); } @Test public void testInit(){ assertFalse("Workdir already existed", workFolder.exists()); controller.init(); assertTrue("Workdir did not exist", workFolder.exists()); } @Test public void testUpload() throws IOException { controller.init(); long files = workFolder.list().length; assertEquals("folder contained files", 0, files); MockMultipartFile file = mockMultipartFile; String view = controller.upload(file); files = workFolder.list().length; assertEquals("folder contained files", 1, files); } @Test public void testHandleUploaded() throws IOException { controller.init(); controller.upload(mockMultipartFile); List<Person> persons = new LinkedList<Person>(); List<Tag> tags = new LinkedList<Tag>(); when(personService.getPersons()).thenReturn(persons); when(tagService.getTags()).thenReturn(tags); Model model = new ExtendedModelMap(); String view = controller.handleUploadedFiles(model, null); assertEquals("Wrong view", "no/dusken/aranea/base/admin/image/imageUpload", view); assertTrue("Number of files missing", model.containsAttribute("numberOfFiles")); assertEquals("Wrong tags", tags, model.asMap().get("tags")); assertEquals("Wrong persons", persons, model.asMap().get("persons")); assertEquals("Wrong number of files", new Integer(1), model.asMap().get("numberOfFiles")); assertEquals("Wrong filename", "file2.jpg", model.asMap().get("filename")); assertNotNull("No encodedImage", model.asMap().get("encodedImage")); } @Test public void testNoFiles(){ controller.init(); Model model = new ExtendedModelMap(); String view = controller.handleUploadedFiles(model, null); assertEquals("Wrong view", "no/dusken/aranea/base/admin/image/imageUpload", view); assertEquals("noFiles", 0, model.asMap().get("numberOfFiles")); } @Test public void testHandleFile() throws IOException { controller.init(); MockMultipartFile file2 = new MockMultipartFile("File", "file.jpg","img", new byte[]{1,2, 3, 4,5, 66, 7, 7, 8, 9, 77, 8,9, 0} ); controller.upload(mockMultipartFile); controller.upload(file2); Image image = new Image(); image.setID(12L); when(imageService.saveOrUpdate(Matchers.<Image>anyObject())).thenReturn(image); when(storeImageService.createImage(Matchers.<File>anyObject())).thenReturn(image); ImageUploadController.ImageResponse ir = controller.handleUploadedFile("file.jpg", new Person(), "", false, new LinkedList<Tag>(), "image", null, null, 0); Long newObjectId = ir.newImageId; Boolean isPageImage = ir.isPageImage; String nextFile = ir.nextFileName; String encodedImage = ir.encodedImage; assertEquals("Wrong ID", image.getID(), newObjectId); assertEquals("Wrong isPageImage", false, isPageImage); assertEquals("Wrong file", "file2.jpg", nextFile); assertNotNull("Encoded Image was null", encodedImage); } @Test public void testHandlePageImage() throws IOException { controller.init(); controller.upload(mockMultipartFile); Image image = new Image(); image.setID(12L); when(imageService.saveOrUpdate(Matchers.<Image>anyObject())).thenReturn(image); when(storeImageService.createImage(Matchers.<File>anyObject())).thenReturn(image); Article a = new Article(); a.setID(13L); PageImage pi = new PageImage(); pi.setID(14L); when(pageImageService.saveOrUpdate(Matchers.<PageImage>anyObject())).thenReturn(pi); File f = new File(workFolder, "file2.jpg"); assertTrue("File did not exist", f.exists()); ImageUploadController.ImageResponse ir = controller.handleUploadedFile("file2.jpg", new Person(), "", false, new LinkedList<Tag>(), "image", a, "", 0); Long newObjectId = ir.newImageId; Boolean isPageImage = ir.isPageImage; Long pageImageId = ir.newPageImageId; String next = ir.nextFileName; String nextEncoded = ir.encodedImage; assertEquals("Wrong ID", image.getID(), newObjectId); assertEquals("Wrong ID", pi.getID(), pageImageId); assertEquals("Wrong isPageImage", true, isPageImage); assertFalse("File was not deleted", f.exists()); assertNull("There should be no next file", next); assertNull("There should be no next file", nextEncoded); } @Test public void testUpdateAlreadyUpdatedFile() throws IOException { controller.init(); Article a = new Article(); a.setID(13L); PageImage pi = new PageImage(); pi.setID(14L); when(pageImageService.saveOrUpdate(Matchers.<PageImage>anyObject())).thenReturn(pi); File f = new File(workFolder, "file2.jpg"); assertFalse("File did not exist", f.exists()); ImageUploadController.ImageResponse ir = controller.handleUploadedFile("file.jpg", new Person(), "", false, new LinkedList<Tag>(), "image", a, "", 0); assertEquals("ID should have been 0", new Long(0), ir.newImageId); assertFalse("IsPageImage should have been false", ir.isPageImage); } @Before public void after(){ if(workFolder.exists()){ for (File f : workFolder.listFiles()){ f.delete(); } workFolder.delete(); } } }